Correction du Sujet 06 - NSI 2026

Exercice 1 : Programmation orientée objet et sécurité des communications

Partie A

1) Instructions d'import à ajouter dans application.py
from donnees import vehicules, energie
from chauffeur import Chauffeur
from taxi import Taxi
from client import Client
from course import Course
2) Instanciation du chauffeur John Doe
john = Chauffeur("Doe", "John", "140159320012")
3) Création du taxi et attribution au chauffeur
taxi_john = Taxi("HG-818-AV", "standard", "électrique", False)
taxi_john.choix_chauffeur(john)
4) Assertion interdisant la création d'une course si le taxi n'est pas libre
assert taxi.est_libre(), "Le taxi n'est pas libre"
5) Instruction à ajouter pour que le taxi ne soit plus libre lors de la création d'une course
Dans le constructeur de la classe Course, après l'affectation du taxi à l'attribut self.taxi, on peut écrire :
self.taxi.modifier_libre(False)
6) Création de la course de Jeanne Doe
jeanne = Client("Doe", "Jeanne", "6 rue des ordinateurs, Paris, France", 2)
course_jeanne = Course(jeanne, taxi_john, jeanne.adresse, "211 avenue Jean Jaurès, Paris, France")
Le nombre 2 correspond aux deux enfants qui accompagnent Jeanne Doe.
7) Méthode temps de la classe Course
def temps(self):
    return (self.date_arrivee - self.date_depart).total_seconds() / 60
8) Complétion de la méthode tarif
def tarif(self):
    type_vehicule = self.taxi.type_vehicule
    donnees_tarifaire = vehicules[type_vehicule]
    prise_en_charge = donnees_tarifaire['prise_en_charge']
    tarif_h = donnees_tarifaire['tarif_horaire']
    prix_km = donnees_tarifaire['prix_km']
    tarif = prise_en_charge
    tarif = tarif + prix_km * self.distance()
    tarif = tarif + tarif_h * self.temps() / 60
    return tarif

Partie B

9) Différence entre chiffrement symétrique et chiffrement asymétrique
Dans un chiffrement symétrique, la même clé sert à chiffrer et à déchiffrer le message. Les deux personnes qui communiquent doivent donc posséder la même clé secrète.

Dans un chiffrement asymétrique, on utilise deux clés différentes : une clé publique, qui peut être diffusée, et une clé privée, qui doit rester secrète. Un message chiffré avec la clé publique du destinataire ne peut être déchiffré qu'avec sa clé privée.
10) Problème de sécurité lors de la transmission directe de la clé de session
Si la clé de session est transmise directement sans protection, une personne qui intercepte la communication peut récupérer cette clé. Elle pourra alors déchiffrer tous les messages chiffrés avec cette clé, et éventuellement se faire passer pour l'un des interlocuteurs.
11) Stratégie sécurisée pour transmettre la clé de session
On peut utiliser un chiffrement hybride :
  1. Le chauffeur possède une clé publique et une clé privée.
  2. L'application récupère la clé publique du chauffeur.
  3. L'application génère une clé de session symétrique.
  4. L'application chiffre cette clé de session avec la clé publique du chauffeur.
  5. Le chauffeur reçoit la clé de session chiffrée et la déchiffre avec sa clé privée.
  6. Les messages suivants sont chiffrés avec la clé de session symétrique.
Cette méthode combine la sécurité du chiffrement asymétrique pour transmettre la clé et la rapidité du chiffrement symétrique pour les messages.

Exercice 2 : Bases de données, réseaux et routage

Partie A

1) Modèles des ordinateurs en réparation
SELECT modele
FROM ordinateur
WHERE etat = 'Réparation';
2) Insertion du nouvel ordinateur Thomson MO5
INSERT INTO ordinateur (id_ordi, marque, modele, etat)
VALUES (22, 'Thomson', 'MO5', 'Panne');
3) Mise à jour de l'état de l'Apple IIe
UPDATE ordinateur
SET etat = 'Fonctionnel'
WHERE id_ordi = 9;
4) Résultat de la requête COUNT
Dans l'extrait donné, les ordinateurs de marque Commodore et d'état Fonctionnel sont : Le résultat de la requête est donc :
2

Partie B

5) Schéma relationnel des relations jeu et plateforme
jeu(id_jeu: INT, titre: TEXT, genre: TEXT, etat: TEXT, #id_plat: INT)
plateforme(id_plat: INT, nom: TEXT, bits: INT)
Dans la relation jeu, id_jeu est la clé primaire et id_plat est une clé étrangère qui référence plateforme(id_plat).
Dans la relation plateforme, id_plat est la clé primaire.
6) Titres des jeux compatibles avec la plateforme Oric
SELECT jeu.titre
FROM jeu
JOIN plateforme ON jeu.id_plat = plateforme.id_plat
WHERE plateforme.nom = 'Oric';
7) Titres des jeux compatibles avec le modèle Amstrad 6128
SELECT jeu.titre
FROM jeu
JOIN ordinateur ON jeu.id_plat = ordinateur.id_plat
WHERE ordinateur.modele = 'Amstrad 6128';

Partie C

8) Commande pour tester la connectivité avec l'ordinateur de Grace
ping 192.168.208.11
9) Conversion de 240 en binaire et nombre de machines ajoutables
On a :
240 = 11110000₂
Le masque 255.255.255.240 correspond donc à un masque /28. Il reste 4 bits pour les machines.

Le nombre total d'adresses dans le sous-réseau est :
2⁴ = 16
On enlève l'adresse du réseau et l'adresse de diffusion, donc il reste :
16 - 2 = 14 adresses utilisables
Comme Alan et Grace utilisent déjà deux adresses, il reste donc 12 machines que l'on peut encore ajouter dans ce réseau local.
10) Table de routage simplifiée du routeur R8 avec le protocole RIP
Le protocole RIP minimise le nombre de sauts. Une table possible est :
DestinationRouteur suivantNombre de sauts
R1R73
R2R52
R3R53
R4R41
R5R51
R6R72
R7R71
Pour certaines destinations, plusieurs chemins de même longueur existent. Par exemple, pour atteindre R2 depuis R8, on peut passer par R5 ou par R4 en deux sauts.
11) Chemin possible pour envoyer un message d'Alan à Ada
Alan est relié au réseau local du routeur R8 et Ada est reliée au réseau local du routeur R6. En utilisant la table RIP donnée, un chemin possible est :
ordinateur d'Alan → switch → R8 → R7 → R6 → ordinateur d'Ada
12) Chemin OSPF de R8 vers R3 et coût total
Avec OSPF, on minimise le coût total des liaisons. Les coûts sont : Le chemin le moins coûteux est :
R8 → R5 → R6 → R1 → R3
Son coût est :
10 + 1 + 10 + 10 = 31
Le coût total est donc 31.

Exercice 3 : Architecture matérielle, assembleur, file et programmation orientée objet

Partie A

1) Nom de l'inventeur du modèle
Il s'agit de John von Neumann. On parle donc du modèle de von Neumann.
2) Association des termes au schéma d'architecture
NuméroÉlément
1Mémoire RAM
2Processeur
3Unité de contrôle
4Unité arithmétique et logique
3) Signification d'une mémoire RAM volatile
Une mémoire volatile perd les données qu'elle contient lorsque l'ordinateur n'est plus alimenté électriquement. Les données stockées dans la RAM disparaissent donc quand on éteint la machine.
4) Classement des mémoires de la plus rapide à la plus lente
Registre → Mémoire cache → Mémoire vive → Disque dur
5) Instruction assembleur de soustraction
sub r2, r5, r4
6) Rôle de l'instruction add r1 r2 0
L'instruction met dans r1 la valeur de r2 à laquelle on ajoute 0. Elle revient donc à copier la valeur de r2 dans r1.
Avec la syntaxe donnée dans le sujet, l'écriture rigoureuse serait plutôt addi r1, r2, 0, car 0 est une valeur immédiate.
7) Suite d'instructions pour échanger les contenus de r1 et r2
addi r3, r1, 0
addi r1, r2, 0
addi r2, r3, 0
8) Valeurs de A, B, C et D dans la table de vérité
Le circuit correspond aux équations d'un additionneur complet :
S = E1 XOR E2 XOR Re
Rs = (E1 AND E2) OR (Re AND (E1 XOR E2))

On obtient donc :
LettreValeur
A0
B1
C1
D1
9) Rôle du circuit étudié
Le circuit réalise l'addition de deux bits E1 et E2 avec une retenue entrante Re. Il produit : C'est donc un additionneur complet sur un bit.

Partie B

10) Structure correspondant à une file
Une file correspond au fonctionnement FIFO : First In, First Out. Le premier élément ajouté est le premier élément retiré.
11) Valeur de l'attribut contenu après Tampon(5)
[None, None, None, None, None]
12) États successifs de la mémoire tampon
L'état initial est :
contenu = [4, 6, 9, None, None]
debut = 0
fin = 3
ÉtapeOpérationÉlément renvoyécontenudebutfin
aRetrait4[4, 6, 9, None, None]13
bAjout de 10[4, 6, 9, 10, None]14
cRetrait6[4, 6, 9, 10, None]24
dRetrait9[4, 6, 9, 10, None]34
eAjout de 3[4, 6, 9, 10, 3]30
fRetrait10[4, 6, 9, 10, 3]40
gRetrait3[4, 6, 9, 10, 3]00
À la fin, comme debut == fin, la file est vide.
13) Valeur de l'attribut contenu après exécution du programme
Les retraits ne suppriment pas réellement les valeurs dans la liste ; ils déplacent seulement l'indice debut. À la fin, la valeur 'o' est écrite à l'indice 0.
['o', 's', 'i', 'n', 'f']
14) Méthode est_vide
def est_vide(self):
    return self.debut == self.fin
15) Méthode retirer_element
def retirer_element(self):
    element = self.contenu[self.debut]
    self.debut = self.debut + 1
    if self.debut == self.capacite:
        self.debut = 0
    return element